home *** CD-ROM | disk | FTP | other *** search
Text File | 1993-06-25 | 6.9 KB | 267 lines | [TEXT/MPS ] |
- (define my-even?
- (lambda (n)
- (if (zero? n)
- #t
- (my-odd? (1- n)))))
- ;
- (define my-odd?
- (lambda (n)
- (if (zero? n)
- #f
- (my-even? (1- n)))))
- ;
- (my-even? 5)
- ;
- ; Get out of global environment--use local environment.
- ;
- (define mutual-even?
- (letrec
- ((my-even? (lambda (n)
- (if (zero? n)
- #t
- (my-odd? (1- n)))))
- (my-odd? (lambda (n)
- (if (zero? n)
- #f
- (my-even? (1- n))))))
- my-even?))
- ;
- (mutual-even? 5)
- ;
- ; Get rid of destructive letrec. Use let instead.
- ; Make a list of the mutually recursive functions.
- ;
- (define mutual-even?
- (lambda (n)
- (let
- ((function-list
- (cons (lambda (functions n) ; even?
- (if (zero? n)
- #t
- ((cdr functions) functions
- (1- n))))
- (lambda (functions n) ; odd?
- (if (zero? n)
- #f
- ((car functions) functions
- (1- n)))))))
- ((car function-list) function-list n))))
- ;
- (mutual-even? 5)
- ;
- ; Curry, and get rid of initial (lambda (n) ...) .
- ;
- (define mutual-even?
- (let
- ((function-list
- (cons (lambda (functions) ; even?
- (lambda (n)
- (if (zero? n)
- #t
- (((cdr functions) functions)
- (1- n)))))
- (lambda (functions) ; odd?
- (lambda (n)
- (if (zero? n)
- #f
- (((car functions) functions)
- (1- n))))))))
- ((car function-list) function-list)))
- ;
- (mutual-even? 5)
- ;
- ; Abstract ((cdr functions) functions) out of if, etc..
- ;
- (define mutual-even?
- (let
- ((function-list
- (cons (lambda (functions)
- (lambda (n)
- ((lambda (f)
- (if (zero? n)
- #t
- (f (1- n))))
- ((cdr functions) functions))))
- (lambda (functions)
- (lambda (n)
- ((lambda (f)
- (if (zero? n)
- #f
- (f (1- n))))
- ((car functions) functions)))))))
- ((car function-list) function-list)))
- ;
- (mutual-even? 5)
- ;
- ; Massage functions into abstracted versions of
- ; originals.
- ;
- (define mutual-even?
- (let
- ((function-list
- (cons (lambda (functions)
- (lambda (n)
- (((lambda (f)
- (lambda (n)
- (if (zero? n)
- #t
- (f (1- n)))))
- ((cdr functions) functions))
- n)))
- (lambda (functions)
- (lambda (n)
- (((lambda (f)
- (lambda (n)
- (if (zero? n)
- #f
- (f (1- n)))))
- ((car functions) functions))
- n))))))
- ((car function-list) function-list)))
- ;
- (mutual-even? 5)
- ;
- ; Separate abstracted functions out from recursive
- ; mechanism.
- ;
- (define mutual-even?
- (let
- ((abstracted-functions
- (cons (lambda (f)
- (lambda (n)
- (if (zero? n)
- #t
- (f (1- n)))))
- (lambda (f)
- (lambda (n)
- (if (zero? n)
- #f
- (f (1- n))))))))
- (let
- ((function-list
- (cons (lambda (functions)
- (lambda (n)
- (((car abstracted-functions)
- ((cdr functions) functions))
- n)))
- (lambda (functions)
- (lambda (n)
- (((cdr abstracted-functions)
- ((car functions) functions))
- n))))))
- ((car function-list) function-list))))
- ;
- (mutual-even? 5)
- ;
- ; Abstract out variable abstracted-functions in 2nd let.
- ;
- (define mutual-even?
- (let
- ((abstracted-functions
- (cons (lambda (f)
- (lambda (n)
- (if (zero? n)
- #t
- (f (1- n)))))
- (lambda (f)
- (lambda (n)
- (if (zero? n)
- #f
- (f (1- n))))))))
- ((lambda (abstracted-functions)
- (let
- ((function-list
- (cons (lambda (functions)
- (lambda (n)
- (((car abstracted-functions)
- ((cdr functions) functions))
- n)))
- (lambda (functions)
- (lambda (n)
- (((cdr abstracted-functions)
- ((car functions) functions))
- n))))))
- ((car function-list) function-list)))
- abstracted-functions)))
- ;
- (mutual-even? 5)
- ;
- ; Separate recursion mechanism into separate function.
- ;
- (define y2
- (lambda (abstracted-functions)
- (let
- ((function-list
- (cons (lambda (functions)
- (lambda (n)
- (((car abstracted-functions)
- ((cdr functions) functions))
- n)))
- (lambda (functions)
- (lambda (n)
- (((cdr abstracted-functions)
- ((car functions) functions))
- n))))))
- ((car function-list) function-list))))
- ;
- (define mutual-even?
- (y2
- (cons (lambda (f)
- (lambda (n)
- (if (zero? n)
- #t
- (f (1- n)))))
- (lambda (f)
- (lambda (n)
- (if (zero? n)
- #f
- (f (1- n))))))))
- ;
- (mutual-even? 5)
- ;
- ; y2 has selector built into it--generalize it!
- ;
- (define y2-choose
- (lambda (abstracted-functions)
- (lambda (selector)
- (let
- ((function-list
- (cons (lambda (functions)
- (lambda (n)
- (((car abstracted-functions)
- ((cdr functions) functions))
- n)))
- (lambda (functions)
- (lambda (n)
- (((cdr abstracted-functions)
- ((car functions) functions))
- n))))))
- ((selector function-list) function-list)))))
- ;
- ; Now we can achieve the desired result--defining
- ; both mutual-even? and mutual-odd? without recursion.
- ;
- (define mutual-even-odd?
- (y2-choose
- (cons (lambda (f)
- (lambda (n)
- (if (zero? n)
- #t
- (f (1- n)))))
- (lambda (f)
- (lambda (n)
- (if (zero? n)
- #f
- (f (1- n))))))))
- ;
- (define mutual-even?
- (mutual-even-odd? car))
- ;
- (define mutual-odd?
- (mutual-even-odd? cdr))
- ;
- (mutual-even? 5)
- (mutual-odd? 5)
- (mutual-even? 4)
- (mutual-odd? 4)
-